package com.wjm.api;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
 * Data:2022年08月15日
 * Author:wjm
 * Content: 文件操作-RandomAccessFile
 *
 *
 *    简介：
 *          java提供了一个对文件随机访问的操作，访问包括读和写操作，该类的读写是基于指针的操作。
 *          RandomAccessFile在对文件进行随机访问的时候有两个模式：
 *               只读模式（只读取文件数据），用 r表示
 *               读写模式（对文件数据进行读写），用 rw表示
 *
 *    构造方法（要求我们传入访问模式）：
 *          RandomAccessFile(File file,String mode)
 *          RandomAccessFile(String filename,String mode)
 *          第一个参数是访问文件，第二个参数是访问模式
 *
 *    字节数据读写操作：
 *          void write(int d)
 *               可以向文件中写出字节，该方法会根据当前指针所在的位置写入一个字节，是将int的低8位写出
 *          void write(byte[] d)
 *               可以向文件中写出一组字节的方法，该方法会根据当前指针所在位置连续写出给定数组中的所有字节
 *          void write(byte[] d,int offset,int len)
 *               该方法会根据当前指针所在位置处连续写出给定数组中的部分字节，这个部分是从数组的offset开始，连续len个字节
 *
 *          int read()
 *               可以从文件中读取字节，该方法会从当前指针位置读取一个byte（8位）填充到int低8位，高24位为0，返回值范围0~255
 *               ，如果返回-1表示读取到了文件末尾EOF（EOF:End Of File），每次读取后自动移动文件指针，准备下一次读取
 *          int read(byte[] d)
 *               可以从文件中批量读取字节的方法，该方法的返回值为实际读取到的字节量
 *
 *          void close()
 *               用来释放与其相关的所有系统资源
 *
 *    文件指针操作：
 *           long getFilePointer()    获取当前指针的位置
 *           void seek(long pos)      将指针移动到给定的位置
 *           int skipBytes(int n)     可以跳过n个字节的方法（具体查阅API文档）
 *
 */
public class RandomAccessFileDemo {
    public static void main(String[] args) {
        try(RandomAccessFile randomAccessFile = new RandomAccessFile(new File("user.txt"),"rw");) {

            randomAccessFile.writeInt(20);
            System.out.println("指针位置:"+randomAccessFile.getFilePointer());
            randomAccessFile.write("a".getBytes());
            System.out.println("指针位置:"+randomAccessFile.getFilePointer());
            System.out.println("------------------------------------------");


            //将指针移回0的位置
            randomAccessFile.seek(0);

            int i = randomAccessFile.readInt();
            System.out.println("读到的内容："+i);
            System.out.println("指针位置:"+randomAccessFile.getFilePointer());
            int a = randomAccessFile.read();
            System.out.println("读到的内容："+a);
            System.out.println("指针位置:"+randomAccessFile.getFilePointer());
            System.out.println("------------------------------------------");

            //将指针移回0的位置
            randomAccessFile.seek(0);

            int b = randomAccessFile.read(new byte[1024]);
            System.out.println("读到的长度："+b);
            System.out.println("指针位置:"+randomAccessFile.getFilePointer());



        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
